<?php

/**********************************************************
	Phpword类是基于原有PHPWord类的二次封装，需要单例模式实现
	需要时变更require_once 'vendor/autoload.php'; 引入路径即可
	说明，保存时参数可以不用加后缀名哦，切提供了直接读取及保存中文文件的优化；
	保存时提供了直接将word导出的功能，并且支持将生成的word转换为pdf格式文件导出，
	前提是开启了php_com_dotnet.dll组件,并且设置com.allow_dcom = true（在php.ini中设置）
***********************************************************/

require_once ROOT_D."/core/library/phpoffice/autoload.php";
class PHPReadWordTemp{
	private  $_templateProcessor; 	#实例化的PHPWord类	
	private static $_getSingoten;	#单例模式
	private $_pdfFileName;          #为word转换为pdf做准备的文件
	private $dir = __DIR__;
	private function __construct($wordTemp){
		$wordtemplate = $this -> charsetTrans($wordTemp);
		$this -> _templateProcessor = new PhpOffice\PhpWord\TemplateProcessor($wordTemp);
	}
	public static function getSingoten( $wordTemp ){
		if (!( self::$_getSingoten instanceof self )) {
           self::$_getSingoten = new self( $wordTemp ); 
        }
        return self::$_getSingoten;
	}
		/**
		 * [wordCloneRow word模板中涉及到克隆行]
		 * @param  [type]     $rowVal            [word模板中需要克隆的行变量,默认需要克隆的行变量为row]
		 * @param  array      $array             [需要循环的数组数据]
		 * @param  string     $tempName          [涉及到指定模板中克隆]
		 * @param  array|null $tempArray     	 [指定需要克隆行的模板数组]
		 * @return [type]                        [word克隆成功，不需要数据返回]
		 */
	public function cloneRow( array $array , $rowVal = 'row' , $tempName= '' ,array $tempArray = null ) {
		$this -> _templateProcessor -> cloneRow( $rowVal , count( $array ) );
		$i = 1;
		if( $tempName && $tempArray && in_array( $tempName, $tempArray ) ) {
			foreach ( $array as $k => $v ) {
				foreach ( $v as $_k => $_v ) {
					$this -> _templateProcessor-> setValue( "$_k#$i" , $_v );
				}
				$i ++;
			}
		}else{
			foreach ( $array as $k => $v ) {
				foreach ( $v as $_k => $_v ) {
					$this -> _templateProcessor-> setValue( "$_k#$i", $_v );
				}
				$i ++;
			}
		}
	}
		/**
		 * [PHPWordSetValue phpword中变量替换函数]
		 * @param [array or string] $data   [需要替换的数组，可以是字符串或数组]
		 * @param string $wordValue         [需要的word中变量，如果替换的是字符串
		 *                                  ，则此项必须,如果是数组，则不需要]
		 */
	public function setValue($data,$wordValue =''){
		$dataType = gettype($data);
		switch ($dataType) {
			case 'string':
				$this -> _templateProcessor -> setValue($wordValue,$data);
				break;
			case 'array':
				unset($wordValue);
				foreach ($data as $k => $v) {
					$this -> _templateProcessor -> setValue($k,$v);
				}
				break;
		}
	}
		/**
		 * [PHPWordSetImg word中图片的替换]
		 * @param [type] $ImgPath [description]
		 * @param [type] $ImgSize [description]
		 */
	public function setImg( $ImageValue , $ImgPath , $ImgSize = ''){
		$arrImage=array('src' => $ImgPath,'swh' => $ImgSize );
		$this -> _templateProcessor -> setImg( $ImageValue , $arrImage );
	}
		/**
		 * [PhpWordSetArrImg word中多图片的替换]
		 * @param [type] $Imgarray [传入的必须是二维数组格式如下]
		 * $Imgarray = array(
		 * 		'0' => array('Img1','img/a1.jpg','300'),
		 * 		'1' => array('Img2','img/a2.png','400')
		 *   );
		 */
	public function setImgArr( $Imgarray ){
		foreach ($Imgarray as $k => $v) {
			$this -> setImg ( $v[0] , $v[1] , $v[2] );
		}
	}
		/**
		* [PHPWorddSave 文件保存的函数]
		 * @param [type] $saveFileName [保存的名称]
		 * @param boolen $isExport     [是否将word文件导出]
		 * @param string $exportName   [导出时word的名称，如果不填写则导出的是保存时的文件名称，支持将生成的word转换为PDF格式导出，前提是开启了php_com_dotnet.dll，及传入的导出名称参数必须带有.pdf格式]
		 */
	public function save( $saveFileName , $isExport=false , $exportName = '' ){
		$suffixName   = strrchr( $saveFileName ,'.' );
		$saveFileName = (  $suffixName == '.doc' || $suffixName  == '.docx' ) ? $saveFileName : $saveFileName .'.doc';
		$savePath = $this -> charsetTrans( $saveFileName );
		$this -> _templateProcessor -> saveAs( $saveFileName );
		var_dump(222);die;
		if($isExport){
			$suffixsaveFileName   = strrchr( $saveFileName ,'/' );
			$saveFileName = $suffixsaveFileName ? substr($suffixsaveFileName, 1,strlen($suffixsaveFileName)) : $saveFileName;
			$exportName = $exportName ? $exportName : $this -> charsetTransTwo($saveFileName) ;
			$exportsuffixName = strtolower(strrchr( $exportName ,'.' ));
			if($exportsuffixName == '.pdf'){
				$this ->_pdfFileName = $saveFileName;
				$savePath = $this -> wordToPdf();
			}else{
				$exportName = ( $exportsuffixName == '.doc' || $exportsuffixName =='.docx' ) ? $exportName : $exportName .'.doc';
			}
			$this -> export($exportName,$savePath);
		}
	}

}